"""
    1.爬取数据 http://stock.finance.sina.com.cn/stock/go.php/vReport_List/kind/lastest/index.phtml
        前50页的数据，需要标题，日期，机构、类型,并转成DataFrame数据格式
    2.保存到Mysql中
    3.筛选报告类型type=行业的数据
    4.对标题进行情感分析
    5.将情感分析按报告的类型求平均值
    6.评估每个调研报告权重最大的关键词，tf-idf 和 textrank 算法
"""
import numpy
from snownlp import SnowNLP
import pandas as pd
import parsel
import requests
import jieba.analyse


# todo 01 爬取数据，并存储为DataFrame


def spider_finance():
    headers = {
        'User-Agent': r'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/'
        r'537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
    }
    title_list = []
    bg_type_list = []
    data_list = []
    institution_list = []
    for i in range(1, 51):
        url = r'http://stock.finance.sina.com.cn/stock/go.php/vReport_List/kind/lastest/index.phtml?p={0}'.format(
            i)
        # print(url)
        response = requests.get(url, headers)
        result = parsel.Selector(response.text)
        list_all = result.xpath('//table[@class="tb_01"]')
        for i in list_all:
            for m in range(3, 43):
                title = i.xpath(f'//tr[{m}]/td[2]/a/text()').get().strip()
                bg_type = i.xpath(f'//tr[{m}]/td[3]/text()').get()
                data = i.xpath(f'//tr[{m}]/td[4]/text()').get()
                institution = i.xpath(
                    f'//tr[{m}]/td[5]/a/div/span/text()').get()
                title_list.append(title)
                bg_type_list.append(bg_type)
                data_list.append(data)
                institution_list.append(institution)
                # print(title_list, bg_type_list, data_list, institution_list)
    # * 存储为DataFrame数据
    df = pd.DataFrame({'title': pd.Series(title_list), 'type': pd.Series(bg_type_list),
                       'data': pd.Series(data_list), 'institution': pd.Series(institution_list)})
    # print(df)
    # todo 02 保存到Mysql中
    # ! 未实现保存到Mysql中
    df.to_csv(r'.\Exercise\2021-01-14\02.csv',
              sep=',', index=True, header=True)


spider_finance()


# todo 03
df = pd.read_csv(r'.\Exercise\2021-01-14\02.csv', sep=',')
# ? 按列名 type='行业'，将符合的条目筛选出来
df2 = df[df['type'].str.contains('行业')]
print(df2)

# todo 04
# ! SnowNLP 情感分析相关说明


def QingGanFenXin():
    df = pd.read_csv(r'.\Exercise\2021-01-14\02.csv', sep=',')
    sentiment_1 = []
    for i in range(len(df['title'])):
        word = df['title'][i]
        scord = SnowNLP(word).sentiments
        print(scord)
        sentiment_1.append(scord)
    df['sentiment'] = sentiment_1
    # * 带情感分析的分数的样本
    df.to_csv(r'.\Exercise\2021-01-14\02_2.csv',
              sep=',', index=True, header=True)


QingGanFenXin()
# todo 05
df = pd.read_csv(r'.\Exercise\2021-01-14\02_2.csv', sep=',')
df2 = df.groupby(by=df['type']).agg({'sentiment': numpy.mean})
print(df2)

# todo 06
# ! tf-idf 和 textrank 算法 使用的jieba模块
# * 使用02.txt代替调研报告
sentence = '''12 月出口同比（美元计价）增长18.1%，保持强劲。进口同比（美元计价）增长6.5%，较上月小幅抬升。由于出口表现强于进口，12 月货物贸易顺差扩大至782 
    亿美元。分地区看，对美国和欧盟出口增速略有放缓，对亚洲国家和地区出口加快扩张，显示区域间贸易持续回暖。分行业看，防疫物资和部分居家用品出口增速放缓，音视频设备、集成电路、以及自动数据处理设备出口增速上升。
    全年来看，2020 年我国出口总额（美元计价）增长3.6%，高于2019 年的0.5%。进一步看，2020 年我国出口呈现出五大特征：
    其一，经常项目顺差显著扩大，其中，商品顺差创历史新高，服务逆差大幅收窄。海外消费需求大增，加上中国生产恢复快，是商品顺差扩大的主要原因，而服务逆差收窄主要因为出境旅行活动大幅萎缩。
    其二，对美国出口大爆发，集装箱“一箱难求”。疫情期间美国耐用品消费表现强劲，加上前期基数低，使得对美出口同比大幅反弹。粗略估计，2020 年我国出口中约有三分之一来自对美出口的贡献。
    其三，消费品出口复苏快于工业品。疫情影响下，防疫物资和居家用品出口大增，使得2020 年消费品出口领先于工业品复苏，这与2017 年工业品领先消费品的格局明显不一样。
    其四，一般贸易增长好于加工贸易。前期中美贸易摩擦导致部分加工贸易企业已转移至海外，加上疫情期间海外供应链不畅，抑制了加工贸易出口的复苏。
    其五，主要省市出口表现明显分化。在传统出口大省中，山东、浙江表现抢眼，广东、江苏相对较弱，这一差异为近几年来最高。一个可能的解释是，山东、浙江的出口产业
    与疫情期间的海外需求更匹配，比如山东的家电、浙江的纺织产业都比较发达。另外浙江跨境电商发展较快，在支持出口方面也发挥了重要作用。广东出口表现较弱可能与其加工贸易出口比重高有关，因此受的影响也更大。这些区域差异也反映了当前经济复苏的不平衡与不牢固。
    '''

# ? TF_IDF


def TF_IDF():
    keywords = jieba.analyse.extract_tags(
        sentence, topK=20, withWeight=True, allowPOS=('n', 'nr', 'ns'))

    for item in keywords:
        print(item[0], item[1])


TF_IDF()
# ? TextRank


def TextRank():
    keywords = jieba.analyse.textrank(
        sentence, topK=20, withWeight=True, allowPOS=('n', 'nr', 'ns'))

    for item in keywords:
        print(item[0], item[1])       


TextRank()